 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_DATOS_EMPRESA;
import CONTABILIDAD_MODELO.CON_MONEDA;
import Conexion.Conexion;
import RRHH_Modelo.RHH_CREDITO_FISCAL;
import RRHH_Modelo.RHH_DEPARTAMENTO;
import RRHH_Modelo.RHH_EVENTOS_HITO;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS;
import RRHH_Modelo.RHH_PLANILLA_PRIMA;
import RRHH_Modelo.RHH_PLANILLA_PRIMA_CABECE;
import RRHH_Modelo.RHH_PLANILLA_PRIMA_CABE_PENDI;
import RRHH_Modelo.RHH_REGIONAL;
import RRHH_Modelo.RHH_SALARIO_MINIMO;
import RRHH_Modelo.RHH_SUCURSAL;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@MultipartConfig
@WebServlet(name = "RRHH_PLANILLA_PRIMAS_PENDIENTES_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_PRIMAS_PENDIENTES_CONTROLLER"})
public class RRHH_PLANILLA_PRIMAS_PENDIENTES_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            RHH_USUARIO usuario = ((RHH_USUARIO) request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String evento = request.getParameter("evento");
            String html = "";

            switch (evento) {
                case "cargarLista":
                    html = cargarLista(request, con);
                    break;
                case "calcular_fila":
                    html = calcular_fila(request, con);
                    break;
                case "mostrar":
                    html = mostrar(request, con);
                    break;                    
                case "nueva_planilla":
                    html = nueva_planilla(request, con);
                    break;                                           
                case "cerrar":
                    html = cerrar(request, con);
                    break;                
                case "estado":
                    html = estado(request, con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        } catch (SQLException ex) {
            Logger.getLogger(RRHH_PLANILLA_PRIMAS_PENDIENTES_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String cargarLista(HttpServletRequest request, Conexion con) throws SQLException {
        int ano = Integer.parseInt(request.getParameter("ano"));
        String html="<ul>";
        List<RHH_PLANILLA_PRIMA_CABE_PENDI> lista_cabeceras = new RHH_PLANILLA_PRIMA_CABE_PENDI(con).BuscarXano(ano);
        for(RHH_PLANILLA_PRIMA_CABE_PENDI planilla:lista_cabeceras)
        {
            if(planilla.getESTADO()==0)
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a></li>";
            else
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a><a href='#' onclick='eliminar("+planilla.getID()+",this);'>(X)</a><a href='#' onclick='cerrar("+planilla.getID()+",this);'>(CERRAR)</a></li>";
        }
        return html+"</ul><button type='button' onclick='nueva_planilla();'>NUEVA PLANILLA</button>";
    }        
    
    private String mostrar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));        

        RHH_PLANILLA_PRIMA_CABE_PENDI planilla = new RHH_PLANILLA_PRIMA_CABE_PENDI(con).Buscar(id_planilla);
        String html = "";
        if(planilla!=null)
        {
            html += "<thead>";
            html += "<tr>";            
            html += "<th rowspan='2'>CI</th>";
            html += "<th rowspan='2'>LUGAR DE EMISION</th>";
            html += "<th rowspan='2'>NOMBRES</th>";
            html += "<th rowspan='2'>APELLIDO PATERNO</th>";
            html += "<th rowspan='2'>APELLIDO MATERNO</th>";
            html += "<th rowspan='2'>FECHA CONTRATACION</th>";
            html += "<th rowspan='2'>FECHA RETIRO</th>";
            html += "<th colspan='3'>ANTIGUEDAD</th>";
            html += "<th rowspan='2'>CARGO</th>";
            html += "<th rowspan='2'>DEPARTAMENTO</th>";
            html += "<th rowspan='2'>REGIONAL</th>";
            html += "<th rowspan='2'>SUCURSAL</th>";
            html += "<th rowspan='2'>MESES TRABAJADOS AÑO ACTUAL</th>";
            html += "<th rowspan='2'>DIAS TRABAJADOS AÑO ACTUAL</th>";        
            html += "<th rowspan='2'>CANTIDAD DE PAGOS</th>";
            html += "<th rowspan='2'>MONTO</th>";
            html += "<th rowspan='2'>MONTO TOTAL</th>";
            html+="<th colspan='6'>APORTE LABORAL</th>";                        
            html+="<th colspan='5'>APORTE PATRONAL</th>";                        
            html+="<th rowspan='2'>SUELDO NETO SUJETO A IMPUESTOS</th>";
            html+="<th rowspan='2'>MINIMO NO IMPONIBLE</th>";
            html+="<th rowspan='2'>DIFERENCIA SUJETA A IMPUESTOS</th>";
            html+="<th rowspan='2'>IMPUESTO LIQUIDADO</th>";
            html+="<th rowspan='2'>COMPUTO IVA SIN DDJJ</th>";
            html+="<th rowspan='2'>13% SOBRE DOS SALARIOS MINIMOS</th>";
            html+="<th rowspan='2'>SALDO FAVOR IMPUESTOS</th>";
            html+="<th rowspan='2'>SALDO FAVOR EMPLEADO</th>";
            html+="<th rowspan='2'>SALDO MES ANTERIOR</th>";        
            html+="<th rowspan='2'>UFV MES ANTERIOR</th>";
            html+="<th rowspan='2'>UFV ACTUAL</th>";
            html+="<th rowspan='2'>ACTUALIZACION</th>";
            html+="<th rowspan='2'>SUB TOTAL i + j</th>";
            html+="<th rowspan='2'>SALDO TOTAL A FAVOR EMPLEADO</th>";
            html+="<th rowspan='2'>SALDO UTILIZADO</th>";
            html+="<th rowspan='2'>IMPUESTO RETENIDO A PAGAR</th>";
            html+="<th rowspan='2'>SALDO A FAVOR SIGTE MES</th>";
            html+="<th rowspan='2'>TOTAL DESCUENTO MES</th>";            
            html+="<th rowspan='2'>TOTAL LIQUIDO PAGABLE</th>";                
            html+="</tr>";                
            html+="<tr>";             
            html+="<th>DIA</th>";
            html+="<th>MES</th>";
            html+="<th>AÑO</th>";        
            html+="<th>SEGURO LARGO PLAZO</th>";
            html+="<th>RIESGO COMUN</th>";
            html+="<th>COMISION AFP</th>";
            html+="<th>SOLIDARIO ASEGURADO</th>";
            html+="<th>SOLIDARIO NACIONAL</th>";
            html+="<th>TOTAL APORTE LABORAL</th>";
            html+="<th>CSBP</th>";
            html+="<th>RIESGO PROFECIONAL</th>";
            html+="<th>PRO VIVIENDA</th>";
            html+="<th>APORTE SOLIDARIO</th>";
            html+="<th>TOTAL APORTE PATRONAL</th>";
            html+="</tr>";                
            html += "</thead>";
            html += "<tbody>";
            List<RHH_PLANILLA_PRIMA> lista_detalle = new RHH_PLANILLA_PRIMA(con).BuscarXmaestro_Pendientes(id_planilla);
            if(planilla.getESTADO()==0)
            {
                for (RHH_PLANILLA_PRIMA detalle : lista_detalle) {
                    if(detalle.getESTADO_PENDIENTES_PRIMA()==0)
                    {
                        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());                
                        html += "<tr>";                                    
                        html += "<td>" + per.getCI() + "</td>";
                        html += "<td>" + per.getLUGAR_EMISION() + "</td>";
                        html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
                        html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
                        html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
                        html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
                        if (detalle.getFECHA_RETIRO() != null) {
                            html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
                        } else {
                            html += "<td></td>";
                        }
                        html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
                        html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
                        html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
                        String cargo = detalle.getCARGO();
                        cargo = cargo==null?"":cargo;
                        html += "<td>" + cargo + "</td>";

                        String depto = "***";
                        int id_deto=detalle.getDEPARTAMENTO();
                        if(id_deto!=0)
                            depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
                        html += "<td>" + depto + "</td>";

                        String reg = "***";
                        int id_reg=detalle.getREGIONAL();
                        if(id_reg!=0)
                            reg = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();                
                        html += "<td>" + reg + "</td>";

                        String suc = "***";
                        int id_suc=detalle.getSUCURSAL();
                        if(id_suc!=0)
                            suc = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();                
                        html += "<td>" + suc + "</td>";

                        html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
                        html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";

                        html += "<td>" + detalle.getCANTIDAD_PAGOS() + "</td>";

                        html += "<td>" + detalle.getMONTO()+ "</td>";
                        html += "<td>" + detalle.getMONTO_TOTAL() + "</td>";


                        html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
                        html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
                        html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                        html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
                        html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
                        html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
                        html+="<td>"+detalle.getCSBP()+"</td>";
                        html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                        html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
                        html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
                        html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
                        html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
                        html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";            

                        html+="<td>"+detalle.getCOMPUTO_IVA()+"</td>";

                        html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
                        html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";

                        html+="<td>"+detalle.getSALDO_MES_ANTERIOR()+"</td>";
                        html+="<td>"+detalle.getUFV_MES_PASADO()+"</td>";
                        html+="<td>"+detalle.getUFV_ACTUAL()+"</td>";

                        html+="<td>"+detalle.getACTUALIZACION()+"</td>";                
                        html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
                        html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";               
                        html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";                
                        html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";                
                        html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";                
                        html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";                
                        html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";
                        html += "</tr>";
                    }
                }
            }            
            html += "</tbody>";
            return html;
        }
        else
            return "";
    }
    
    private String cerrar(HttpServletRequest request, Conexion con) throws SQLException 
    {
        String consulta =   "select * "
                + "from BROKER.RHH_PLANILLA_PRIMA, BROKER.RHH_PLANILLA_PRIMA_CABECE "
                + "where ESTADO_PENDIENTES_PRIMA = 1 "
                + "and ID_CABECERA_PENDIENTES is null "
                + "and RHH_PLANILLA_PRIMA_CABECE.ID = RHH_PLANILLA_PRIMA.ID_PRIMA_CABECERA "
                + "and RHH_PLANILLA_PRIMA_CABECE.ESTADO=0 "
                + "order by RHH_PLANILLA_PRIMA.ID_PRIMA_CABECERA";
        
        ResultSet rs = con.EjecutarConsulta(consulta);
        int num_aux=0;
        int id_n=0;
        while(rs.next()) 
        {
            RHH_PLANILLA_PRIMA detalle = new RHH_PLANILLA_PRIMA(con).Buscar(rs.getInt("ID"));
            int numero = detalle.getID_PRIMA_CABECERA();
            RHH_PLANILLA_PRIMA_CABECE cabe = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(numero);
            String chec = request.getParameter("cb_"+detalle.getID());
            
            if(chec!=null)
            {
                if(numero!=num_aux)
                {
                    Calendar cal = new GregorianCalendar();
                    RHH_PLANILLA_PRIMA_CABE_PENDI pend = new RHH_PLANILLA_PRIMA_CABE_PENDI(0, cabe.getESTADO(), cabe.getANO_PAGADO(), cal.getTime(), cabe.getDESCRIPCION_PAGO(), cabe.getNUMERO_PAGO());
                    pend.setCon(con);
                    id_n = pend.Insertar();
                    num_aux=numero;
                }            
            
                detalle.setID_CABECERA_PENDIENTES(id_n);
                detalle.setESTADO_PENDIENTES_PRIMA(0);
                detalle.Modificar();
            }
        }
        
        /*if(detalle.getESTADO_PENDIENTES_PRIMA()==0)
        {
            double debito = detalle.getIMPUESTO_RETENIDO_PAGAR();
            double credito = detalle.getSALDO_FAVOR_SIGUIENTE_MES();
            RHH_CREDITO_FISCAL credito_fiscal = new RHH_CREDITO_FISCAL(con);
            credito_fiscal.setID_USUARIO(detalle.getID_USUARIO());
            credito_fiscal.setDEBITO(debito);
            credito_fiscal.setCREDITO(credito);
            credito_fiscal.Insertar();
            if(debito>credito)
            {
                double resto = debito-credito;
                credito_fiscal.setCREDITO(resto);
                credito_fiscal.setDEBITO(0);
                credito_fiscal.Insertar();
            }
        }
        return "<a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a>";*/        
        return "";
    }
        
    private String nueva_planilla(HttpServletRequest request, Conexion con) throws SQLException {              
        String html="";        
        String consulta =   "select * "
                + "from BROKER.RHH_PLANILLA_PRIMA, BROKER.RHH_PLANILLA_PRIMA_CABECE "
                + "where ESTADO_PENDIENTES_PRIMA = 1 "
                + "and ID_CABECERA_PENDIENTES is null "
                + "and RHH_PLANILLA_PRIMA_CABECE.ID = RHH_PLANILLA_PRIMA.ID_PRIMA_CABECERA "
                + "and RHH_PLANILLA_PRIMA_CABECE.ESTADO=0 "
                + "order by RHH_PLANILLA_PRIMA.ID_PRIMA_CABECERA";
        ResultSet rs = con.EjecutarConsulta(consulta);

        html += "<thead>";
        html += "<tr>";        
        html += "<th rowspan='2'>SELECCIONAR</th>";        
        html += "<th rowspan='2'>CI</th>";
        html += "<th rowspan='2'>LUGAR DE EMISION</th>";
        html += "<th rowspan='2'>NOMBRES</th>";
        html += "<th rowspan='2'>APELLIDO PATERNO</th>";
        html += "<th rowspan='2'>APELLIDO MATERNO</th>";
        html += "<th rowspan='2'>FECHA CONTRATACION</th>";
        html += "<th rowspan='2'>FECHA RETIRO</th>";
        html += "<th colspan='3'>ANTIGUEDAD</th>";
        html += "<th rowspan='2'>CARGO</th>";
        html += "<th rowspan='2'>DEPARTAMENTO</th>";
        html += "<th rowspan='2'>REGIONAL</th>";
        html += "<th rowspan='2'>SUCURSAL</th>";
        html += "<th rowspan='2'>MESES TRABAJADOS AÑO ACTUAL</th>";
        html += "<th rowspan='2'>DIAS TRABAJADOS AÑO ACTUAL</th>";        
        html += "<th rowspan='2'>CANTIDAD DE PAGOS</th>";
        html += "<th rowspan='2'>MONTO</th>";
        html += "<th rowspan='2'>MONTO TOTAL</th>";
        html+="<th colspan='6'>APORTE LABORAL</th>";                        
        html+="<th colspan='5'>APORTE PATRONAL</th>";                        
        html+="<th rowspan='2'>SUELDO NETO SUJETO A IMPUESTOS</th>";
        html+="<th rowspan='2'>MINIMO NO IMPONIBLE</th>";
        html+="<th rowspan='2'>DIFERENCIA SUJETA A IMPUESTOS</th>";
        html+="<th rowspan='2'>IMPUESTO LIQUIDADO</th>";
        html+="<th rowspan='2'>COMPUTO IVA SIN DDJJ</th>";
        html+="<th rowspan='2'>13% SOBRE DOS SALARIOS MINIMOS</th>";
        html+="<th rowspan='2'>SALDO FAVOR IMPUESTOS</th>";
        html+="<th rowspan='2'>SALDO FAVOR EMPLEADO</th>";
        html+="<th rowspan='2'>SALDO MES ANTERIOR</th>";        
        html+="<th rowspan='2'>UFV MES ANTERIOR</th>";
        html+="<th rowspan='2'>UFV ACTUAL</th>";
        html+="<th rowspan='2'>ACTUALIZACION</th>";
        html+="<th rowspan='2'>SUB TOTAL i + j</th>";
        html+="<th rowspan='2'>SALDO TOTAL A FAVOR EMPLEADO</th>";
        html+="<th rowspan='2'>SALDO UTILIZADO</th>";
        html+="<th rowspan='2'>IMPUESTO RETENIDO A PAGAR</th>";
        html+="<th rowspan='2'>SALDO A FAVOR SIGTE MES</th>";
        html+="<th rowspan='2'>TOTAL DESCUENTO MES</th>";            
        html+="<th rowspan='2'>TOTAL LIQUIDO PAGABLE</th>";                
        html+="</tr>";                
        html+="<tr>";             
        html+="<th>DIA</th>";
        html+="<th>MES</th>";
        html+="<th>AÑO</th>";        
        html+="<th>SEGURO LARGO PLAZO</th>";
        html+="<th>RIESGO COMUN</th>";
        html+="<th>COMISION AFP</th>";
        html+="<th>SOLIDARIO ASEGURADO</th>";
        html+="<th>SOLIDARIO NACIONAL</th>";
        html+="<th>TOTAL APORTE LABORAL</th>";
        html+="<th>CSBP</th>";
        html+="<th>RIESGO PROFECIONAL</th>";
        html+="<th>PRO VIVIENDA</th>";
        html+="<th>APORTE SOLIDARIO</th>";
        html+="<th>TOTAL APORTE PATRONAL</th>";
        html+="</tr>";                
        html += "</thead>";
        html += "<tbody>";
        while (rs.next()) 
        {
            RHH_PLANILLA_PRIMA detalle = new RHH_PLANILLA_PRIMA(con).Buscar(rs.getInt("ID"));
            RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(detalle.getID_PRIMA_CABECERA());
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());
            html += "<td><input type='checkbox' name='cb_"+detalle.getID()+"'/></td>";
            html += "<td>" + per.getCI() + "</td>";
            html += "<td>" + per.getLUGAR_EMISION() + "</td>";
            html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
            html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
            html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
            html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";

            if (detalle.getFECHA_RETIRO() != null) 
            {
                html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
            }
            else 
            {
                html += "<td></td>";
            }
            html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
            String cargo = detalle.getCARGO();
            cargo = cargo==null?"":cargo;
            html += "<td>" + cargo + "</td>";

            String depto = "***";
            int id_deto=detalle.getDEPARTAMENTO();
            if(id_deto!=0)
                depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
            html += "<td>" + depto + "</td>";

            String reg = "***";
            int id_reg=detalle.getREGIONAL();
            if(id_reg!=0)
                reg = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();                
            html += "<td>" + reg + "</td>";

            String suc = "***";
            int id_suc=detalle.getSUCURSAL();
            if(id_suc!=0)
                suc = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();                
            html += "<td>" + suc + "</td>";

            html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
            html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";
            if(planilla.getESTADO()!=0)
                html += "<td><input type='number' value='" + planilla.getNUMERO_PAGO() + "' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");'/></td>";                
            else
                html += "<td>" + planilla.getNUMERO_PAGO() + "</td>";


            double monto_total= detalle.getMONTO()*planilla.getNUMERO_PAGO();

            html += "<td>" + detalle.getMONTO()+ "</td>";
            html += "<td>" + monto_total + "</td>";
            html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
            html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
            html+="<td>"+detalle.getCSBP()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
            html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
            html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
            html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";            
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getCOMPUTO_IVA()+"' min='0'/> </td>";
            html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getSALDO_MES_ANTERIOR()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_MES_PASADO()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_ACTUAL()+"' min='0'/></td>";             
            html+="<td>"+detalle.getACTUALIZACION()+"</td>";                
            html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
            html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";               
            html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";                
            html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";                
            html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";  
            html+="</tr>";  
        }   
        html+="</tbody>";
        return html;
    }

    private String estado(HttpServletRequest request, Conexion con) throws SQLException {
        int id = Integer.parseInt(request.getParameter("id_planilla"));
        RHH_PLANILLA_PRIMA planilla = new RHH_PLANILLA_PRIMA(con).Buscar(id);
        if(planilla.getESTADO_PENDIENTES_PRIMA()==1)
            planilla.cambiarEstado(0);
        else
            planilla.cambiarEstado(1);
        return true+"";
    }

   private String calcular_fila(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));        
        double computo_iva = Double.parseDouble(request.getParameter("computo_iva"));
        double saldo_mes_anterior = Double.parseDouble(request.getParameter("saldo_mes_anterior"));
        double ufv_mes_anterior = Double.parseDouble(request.getParameter("ufv_mes_anterior"));
        double ufv_actual = Double.parseDouble(request.getParameter("ufv_actual"));
        
        String html = "";
        RHH_PLANILLA_PRIMA detalle = new RHH_PLANILLA_PRIMA(con).Buscar(id_planilla);
        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());
        RHH_USUARIO usr = new RHH_USUARIO(con).BuscarXid(detalle.getID_USUARIO());
        List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();        
        if (detalle != null) {            
            RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(detalle.getID_PRIMA_CABECERA());            
            if(detalle.getESTADO_PENDIENTES_PRIMA()==1)
                html += "<td><input type='checkbox' name='cb_"+detalle.getID()+"'/></td>";
            else
                html += "<td><input type='checkbox' name='cb_"+detalle.getID()+"' checked/></td>";
                        
            html += "<td>" + per.getCI() + "</td>";
            html += "<td>" + per.getLUGAR_EMISION() + "</td>";
            html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
            html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
            html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
            html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
            if (detalle.getFECHA_RETIRO() != null) {
                html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
            } else {
                html += "<td></td>";
            }
            html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
            String cargo = detalle.getCARGO();
            cargo = cargo==null?"":cargo;
            html += "<td>" + cargo + "</td>";
            
            String depto = "***";
            int id_deto=detalle.getDEPARTAMENTO();
            if(id_deto!=0)
                depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
            html += "<td>" + depto + "</td>";

            String reg = "***";
            int id_reg=detalle.getREGIONAL();
            if(id_reg!=0)
                reg = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();                
            html += "<td>" + reg + "</td>";

            String suc = "***";
            int id_suc=detalle.getSUCURSAL();
            if(id_suc!=0)
                suc = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();                
            html += "<td>" + suc + "</td>";

            html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
            html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";
            if(planilla.getESTADO()!=0)
                html += "<td><input type='number' value='" + planilla.getNUMERO_PAGO() + "' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");'/></td>";                
            else
                html += "<td>" + planilla.getNUMERO_PAGO() + "</td>";
                        
            
            double monto_total= detalle.getMONTO()*planilla.getNUMERO_PAGO();
            
            html += "<td>" + detalle.getMONTO()+ "</td>";
            html += "<td>" + monto_total + "</td>";
            detalle.setMONTO_TOTAL(monto_total);
            
            double total_ganado_sin_imp = monto_total;
            double porc_largo_plazo=0.0;
            int usuario_estado = usr.getESTADO();
            CON_DATOS_EMPRESA datos_empresa= new CON_DATOS_EMPRESA(con).Buscar();
            
            if(usuario_estado==0||usuario_estado==1)
                porc_largo_plazo = datos_empresa.getPORCENTAJE_LARGO_PLAZO();
            if(usuario_estado==3 ||usuario_estado==4)
                porc_largo_plazo = datos_empresa.getPORCENTAJE_JUBILADOS();

            double seguro_largo_plazo=total_ganado_sin_imp*(porc_largo_plazo/100);            
            detalle.setSEGURO_LARGO_PLAZO(seguro_largo_plazo);
                        
            double porc_riesgo_comun = datos_empresa.getPORCENTAJE_RIESGO_COMUN();
            double riesgo_comun=total_ganado_sin_imp*(porc_riesgo_comun/100);            
            detalle.setRIESGO_COMUN(riesgo_comun);

            double porc_afp = datos_empresa.getPORCENTAJE_COMISION_AFP();
            double afp=total_ganado_sin_imp*(porc_afp/100);            
            detalle.setCOMISION_AFP(afp);

            double porc_solidario_asegurado = datos_empresa.getPORCENTAJE_SOLIDARIO();
            double solidario_asegurado=total_ganado_sin_imp*(porc_solidario_asegurado/100);            
            detalle.setSOLIDARIO_ASEGURADO(solidario_asegurado);

            double monto_SNA = datos_empresa.getMONTO_SOLIDARIO_NAC_A();
            double monto_SNB = datos_empresa.getMONTO_SOLIDARIO_NAC_B();
            double monto_SNC = datos_empresa.getMONTO_SOLIDARIO_NAC_C();
            double porc_SNA = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_A();
            double porc_SNB = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_B();
            double porc_SNC = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_C();

            double solidarion_nacional=0.0;

            if(total_ganado_sin_imp>=monto_SNA && total_ganado_sin_imp<monto_SNB)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
            }
            if(total_ganado_sin_imp>=monto_SNB&&total_ganado_sin_imp<monto_SNC)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
            }
            if(total_ganado_sin_imp>=monto_SNC)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNC)*(porc_SNC/100);
            }

            detalle.setSOLIDARIO_NACIONAL(solidarion_nacional);

            Double total_aporte_laboral = seguro_largo_plazo+riesgo_comun+afp+solidario_asegurado+solidarion_nacional;            
            detalle.setTOTAL_APORTE_LABORAL(total_aporte_laboral);

            double porc_csbp = datos_empresa.getPORCENTAJE_CSBP_SEG_MED();
            double csbp=total_ganado_sin_imp*(porc_csbp/100);            
            detalle.setCSBP(csbp);

            double porc_afp_pro = datos_empresa.getPORCENTAJE_RISEGO_PROFESIONAL();
            double afp_pro=total_ganado_sin_imp*(porc_afp_pro/100);            
            detalle.setRIESGO_PROFESIONAL(afp_pro);

            double porc_aporte_pro = datos_empresa.getPORCENTAJE_APORTE_PRO();
            double aporte_pro=total_ganado_sin_imp*(porc_aporte_pro/100);            
            detalle.setPRO_VIVIENDA(aporte_pro);

            double porc_aporte_solidario = datos_empresa.getPORCENTAJE_SOLIDARIO();
            double aporte_solidario=total_ganado_sin_imp*(porc_aporte_solidario/100);            
            detalle.setAPORTE_SOLIDARIO(aporte_solidario);

            double total_aporte_patronal = csbp+afp_pro+aporte_pro+aporte_solidario;            
            detalle.setTOTAL_APORTE_PATRONAL(total_aporte_patronal);

            double salario_neto_sujeto_imp = total_ganado_sin_imp-total_aporte_laboral;            
            detalle.setMONTO_NETO_SUJ_IMPUESTOS(salario_neto_sujeto_imp);
            
            double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();
            double minimo_moinmp=salariominimo_nal*2;

            if(minimo_moinmp>=salario_neto_sujeto_imp)
                minimo_moinmp=salario_neto_sujeto_imp;            
            detalle.setMINIMO_NO_IMPONIBLE(minimo_moinmp);

            double dif_sujeta_impuestos= salario_neto_sujeto_imp-minimo_moinmp;            
            detalle.setDIFERENCIA_SUJETA_IMPUESTOS(dif_sujeta_impuestos);

            double imp_liquidado = dif_sujeta_impuestos*0.13;            
            detalle.setIMPUESTO_LIQUIDADO(imp_liquidado);

            double computo_iva_ddj=computo_iva;
            detalle.setCOMPUTO_IVA(computo_iva_ddj);

            double sobre_dos_salarios_minimos= 0.0;
            if(dif_sujeta_impuestos!=0)
            {
                if(imp_liquidado<(0.13*(salariominimo_nal*2)))
                    sobre_dos_salarios_minimos=imp_liquidado;
                else
                    sobre_dos_salarios_minimos=(0.13*(salariominimo_nal*2));
            }            
            detalle.setSOBRE_2_SALARIOS_MINIMOS(sobre_dos_salarios_minimos);


            double saldo_favor =0.0;
            if((imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos)<0)
                saldo_favor=0.0;
            else
                saldo_favor=(imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos);            
            detalle.setSALDO_FAVOR_IMPUESTOS(saldo_favor);

            double saldo_favor_empleado=0.0;
            if(sobre_dos_salarios_minimos>imp_liquidado)
                saldo_favor_empleado=0.0;
            else
            {
                if(sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado<0)
                    saldo_favor_empleado=0.0;
                else
                    saldo_favor_empleado=sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado;
            }            
            detalle.setSALDO_FAVOR_EMPLEADOS(saldo_favor_empleado);

            Calendar fecha_anterior = new GregorianCalendar();
            fecha_anterior.add(Calendar.MONTH, -1);
            int ano_anterior=fecha_anterior.get(Calendar.YEAR);
            int mes_anterior=fecha_anterior.get(Calendar.MONTH)+1;
            RHH_PLANILLA_EMPLEADOS planilla_anterior=new RHH_PLANILLA_EMPLEADOS(con).BuscarxUSUARIO(ano_anterior, mes_anterior, usr.getID());
                        
            detalle.setSALDO_MES_ANTERIOR(saldo_mes_anterior);

            CON_MONEDA moneda = new CON_MONEDA();
            moneda.setCon(con);           

            double moneda_inflacionaria_mes_anterior = ufv_mes_anterior;
            detalle.setUFV_MES_PASADO(moneda_inflacionaria_mes_anterior);

            double moneda_inflacionaria_actual = ufv_actual;
            detalle.setUFV_ACTUAL(moneda_inflacionaria_actual);

            double actualizacion = ((saldo_mes_anterior/moneda_inflacionaria_mes_anterior)*moneda_inflacionaria_actual)-saldo_mes_anterior;            
            detalle.setACTUALIZACION(actualizacion);

            double sub_total = saldo_mes_anterior+actualizacion;            
            detalle.setSUB_TOTAL(sub_total);

            double saldo_total_a_favor_empleado = saldo_favor_empleado+sub_total;            
            detalle.setSALDO_TOTAL_FAVOR_EMPLEADO(saldo_total_a_favor_empleado);

            double saldo_utilizado=0.0;            
            if(saldo_total_a_favor_empleado>saldo_favor)
                saldo_utilizado=saldo_favor;
            else
                saldo_utilizado=saldo_total_a_favor_empleado;

            detalle.setSALDO_UTILIZADO(saldo_utilizado);

            double impuesto_retenido_pagar=0.0;            
            if(saldo_total_a_favor_empleado<saldo_favor)
            impuesto_retenido_pagar=saldo_favor-saldo_total_a_favor_empleado;

            detalle.setIMPUESTO_RETENIDO_PAGAR(impuesto_retenido_pagar);

            double saldo_favor_sigte_mes=0.0;
            if(saldo_total_a_favor_empleado>saldo_favor)
            saldo_favor_sigte_mes=saldo_total_a_favor_empleado-saldo_utilizado;

            detalle.setSALDO_FAVOR_SIGUIENTE_MES(saldo_favor_sigte_mes);                       

            double total_desc_mes = total_aporte_laboral+impuesto_retenido_pagar;//(falta atraso, faltas, sanciones, deuda celular)            
            detalle.setTOTAL_DESCUENTO_MES(total_desc_mes);                      

            double total_liquido_pagable =total_ganado_sin_imp-total_desc_mes;            
            detalle.setTOTAL_LIQUIDO_PAGABLE(total_liquido_pagable);     

            html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
            html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
            html+="<td>"+detalle.getCSBP()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
            html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
            html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
            html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";            
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getCOMPUTO_IVA()+"' min='0'/> </td>";
            html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getSALDO_MES_ANTERIOR()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_MES_PASADO()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_ACTUAL()+"' min='0'/></td>";             
            html+="<td>"+detalle.getACTUALIZACION()+"</td>";                
            html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
            html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";               
            html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";                
            html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";                
            html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";        
            detalle.Modificar();
        }           
        return html;
    }
        
}
